package a27_GenericityUse.GenericityCharacters;

import java.lang.reflect.Array;
import java.util.ArrayList;

/**
 * @Author quan
 * @Description 泛型的特点以及通配符的使用
 * @Date 2023/3/15 22:21
 */
public class MyGenericity {
    public static void main(String[] args) {
        //创建集合：数据类型不同
        ArrayList<Ye> list1 = new ArrayList<>();
        ArrayList<Fu> list2 = new ArrayList<>();
        ArrayList<Zi> list3 = new ArrayList<>();
        ArrayList<Student> list4 = new ArrayList<>();
        /**
         * 泛型特点：泛型不具备继承性：由于method方法里的类型参数为Ye，即便是Fu,Zi也不能传递,只能传递Ye类型
         */
        //调用method方法
        method1(list1);
//        method1(list2);//报错
//        method1(list3);//报错
        /**
         * 泛型特点：但是数据具备继承性
         */
        list1.add(new Ye());
        list1.add(new Fu());
        list1.add(new Zi());

        method2(list1);
        method2(list2);
        method2(list3);
        method2(list4);

        method3(list1);
        method3(list2);
        method3(list3);
//        method3(list4);//报错：只能传递Ye和Ye的子类

        method4(list1);
        method4(list2);
        method4(list3);
//        method4(list4);//报错：只能传递Zi的父类
    }
    /**
     * method1只能传递Ye类型
     */
    public static void method1(ArrayList<Ye> list){

    }
    /**
     * method2是一个泛型方，可以传递任意的数据类型，包括有继承关系的Ye Fu Zi,以及单独的没有任何关系的Student类
     */
    public static<E> void method2(ArrayList<E> list){

    }
    /**
     * 泛型的通配符：
     * 希望：这个方法虽然不确定要传递的类型，但是希望只能传递Ye Fu Zi，Student不行，则可以使用泛型的通配符
     * ?表示不确定的类型
     * ? extends E:表示可以传递E或者E的所有子类
     * ? super E:表示可以传递E或者E的所有父类
     */
    public static void method3(ArrayList<? extends Ye> list){

    }

    public static void method4(ArrayList<? super Zi> list){

    }
}
//创建具有继承关系的三个类
class Ye{}
class Fu extends Ye {}
class Zi extends Fu {}
class Student{}
